package com.itqf.service.impl;

import com.itqf.captcha.CaptchaManager;
import com.itqf.dao.UserDao;
import com.itqf.dao.impl.UserDaoImpl;
import com.itqf.pojo.User;
import com.itqf.service.UserService;
import com.itqf.utils.*;
import com.itqf.vo.R;

import java.sql.SQLException;
import java.util.Map;
import java.util.UUID;

/**
 * projectName: gpshop
 *
 * @author: 赵伟风
 * time: 2021/7/20 15:08
 * description:
 */
public class UserServiceImpl implements UserService {

    /**
     * 检查账号是否存在!
     *
     * @param uAccount 要检查的账号!
     * @return 如果存在返回0 不存在返回1
     */
    @Override
    public R checkAccount(String uAccount) throws SQLException {

        //1.参数判断
        if (uAccount == null || uAccount == "") {

            return R.fail("注册的账号为null!");
        }
        //2.数据库查询
        UserDao userDao = new UserDaoImpl();
        long count = userDao.queryAccount(uAccount);

        //3.结果判断
        if (count >= 1) {

            return R.fail("注册的账号已经存在!");
        }

        return R.ok("账号可以注册!");
    }



    /**
     * 注册业务方法
     *
     * @param user 需要注册的用户信息
     * @return 返回注册结果
     */
    @Override
    public R register(User user) throws SQLException {

        //1.判断参数问题
        // uAccount uPassword uEmail
        if(StrUtils.isEmpty(user.getuAccount()) || StrUtils.isEmpty(user.getuPassword())
                || StrUtils.isEmpty(user.getuEmail()))
        {

            return R.fail("账号或者密码或者邮箱为null!");
        }
        //2.查询数据库是否存在账号
        UserDao userDao = new UserDaoImpl();
        long count = userDao.queryAccount(user.getuAccount());
        if (count>0) {

            return R.fail("账号已经被注册!");
        }
        //3.进行账号保存 注册
        //密码+盐+md5
        //明文
        String newPassword = user.getuPassword() + Constants.SALT;
        user.setuPassword(MD5Utils.md5(newPassword));
        //完善token
        user.setuToken(UUID.randomUUID().toString().replace("-", ""));
        //插入数据库
        int rows = userDao.insertUser(user);

        //4.返回结果
        if (rows == 0) {

            return R.fail("用户注册失败!请稍后再试!");
        }

        //发送邮件
        EmailUtils.sendEmail(user);


        return R.ok("用户注册成功!请激活!");
    }

    /**
     * 激活的业务方法
     *
     * @param token 要激活的token 注意 token 还是base64转码的值
     * @return
     */
    @Override
    public R active(String token) throws SQLException {

        //1.处理token
        token = Base64Utils.decode(token);
        //2.查询是否被激活
        UserDao userDao = new UserDaoImpl();
        Long count = userDao.queryToken(token);
        if (count == 0) {
            return R.fail("账号已经被激活!");
        }

        //3.激活[修改数据库 u_state = 1 / u_token = '']

        int rows = userDao.updateUser(token);

        //4.返回成功结果

        if (rows == 0) {

            return R.fail("账号激活失败!");
        }

        return R.ok("账号激活成功,请登录!");
    }


    /**
     * 登录业务处理
     * @param map
     * @return
     */
    @Override
    public R login(Map<String, String[]> map) throws SQLException {

        //map 键值对  四个变量  账号  密码  验证码  自动登录
        //input没写值  map 是否包含input的name属性
        System.out.println("map = " + map);

        //1.判断账号和密码以及验证码是否为null - fail

        if (!map.containsKey("uAccount") || StrUtils.isEmpty(map.get("uAccount")[0]) || !map.containsKey("uPassword") ||
            StrUtils.isEmpty(map.get("uPassword")[0]) || !map.containsKey("code") || StrUtils.isEmpty(map.get("code")[0]))
        {

            return R.fail("账号密码或者验证码为null!");
        }

        //2.判断验证码是否正确
        String code = map.get("code")[0];

        boolean isCode = CaptchaManager.getFromCache(code);

        if (!isCode){

            return R.fail("验证码过期或者验证码错误!");
        }
        //1
        //1.查询账号是否激活
        //2.登录查询

        //2  推荐  性能优先!  实现效果相同!性能优先!
        //1.登录查询  user
        //2.user判断是否激活

        //子查询[空间换时间]  连接查询[时间换空间] 查询的效果一致!推荐连接查询!

        //查询数据库  密码明文
        //密码处理
        String uPassword = map.get("uPassword")[0];
        String newPassword = MD5Utils.md5(uPassword + Constants.SALT);

        UserDao userDao = new UserDaoImpl();
        User user = userDao.queryUser(map.get("uAccount")[0],newPassword);

        if (user == null) {

            return R.fail("账号或者密码错误!");
        }


        if (user.getuState() == 0)
        {
            return R.fail("账号未激活!");
        }


        return R.ok("用户登录成功!", user);
    }


    @Override
    public void addToken(int uid, String token) throws SQLException {

        UserDao userDao = new UserDaoImpl();
        userDao.updateTokenById(uid,token);
    }
}
